#include "addpointdialog.h"
#include "ui_addpointdialog.h"

AddPointDialog::AddPointDialog(const double& aLatitude, const double& aLongitude, QWidget *parent) :
    QDialog(parent), ui(new Ui::AddPointDialog)
{
    QString tmpString;
    ui->setupUi(this);
    // вывод на экран полученных координат
    tmpString.sprintf("%lf", aLatitude);
    ui->latitudeLineEdit->setText(tmpString);
    tmpString.sprintf("%lf", aLongitude);
    ui->longitudeLineEdit->setText(tmpString);
    // установка проверки диапазона вводимых координат
    QRegExp regExpLatitude("-?((90)|(([1-8]?[0-9]?)(\\056)[0-9]{0,10}))");                      // -90 ... 90
    QRegExp regExpLongitude("-?((180)|(((1[0-7][0-9])|([1-9]?[0-9]?))(\\056)[0-9]{0,10}))");    // -180 ... 180
    ui->latitudeLineEdit->setValidator(new QRegExpValidator(regExpLatitude, this));
    ui->longitudeLineEdit->setValidator(new QRegExpValidator(regExpLongitude, this));
    setFixedSize(size());
}

AddPointDialog::~AddPointDialog()
{
    if(ui)  delete ui;
}

bool AddPointDialog::Result(Point* aPoint) const
{
    if(aPoint && IsEnabledToSave())
    {
        aPoint->ClearPoint();
        // установка полученных значений
        aPoint->SetName(ui->pointNameLineEdit->text());
        aPoint->SetCoordinates(ui->latitudeLineEdit->text().toDouble(), ui->longitudeLineEdit->text().toDouble());
        unsigned long N = ui->fileListWidget->count();
        for(unsigned long i = 0; i < N; ++i)
            aPoint->AddFile(ui->fileListWidget->item(i)->data(Qt::UserRole).toString());
        return true;
    }
    else
        return false;
}

void AddPointDialog::on_linkFileButton_clicked()
{
    // получение имени файла
    QString fileName = QFileDialog::getOpenFileName(this, tr("Привязать файл"), "", tr("Все файлы (*.*)"));
    if(!fileName.isEmpty())
    {
        // проверка повторного включения имени файла
        unsigned long N = ui->fileListWidget->count();
        for(unsigned long i = 0; i < N; ++i)
            if(!fileName.compare(ui->fileListWidget->item(i)->data(Qt::UserRole).toString()))
                return;
        // добавление имени файла
        QListWidgetItem *item = new QListWidgetItem(fileName, ui->fileListWidget);
        item->setData(Qt::UserRole, fileName);
        item->setWhatsThis("FILE");
    }
    ui->deleteFileButton->setEnabled(ui->fileListWidget->count() > 0);
}

void AddPointDialog::on_deleteFileButton_clicked()
{
    QListWidgetItem *item = ui->fileListWidget->currentItem();
    if(item)    delete item;
    ui->deleteFileButton->setEnabled(ui->fileListWidget->count() > 0);
}

void AddPointDialog::on_pointNameLineEdit_textChanged(const QString& /*arg1*/)
{
    ui->saveButton->setEnabled(IsEnabledToSave());
}

void AddPointDialog::on_latitudeLineEdit_textChanged(const QString& /*arg1*/)
{
    ui->saveButton->setEnabled(IsEnabledToSave());
}

void AddPointDialog::on_longitudeLineEdit_textChanged(const QString& /*arg1*/)
{
    ui->saveButton->setEnabled(IsEnabledToSave());
}

bool AddPointDialog::IsEnabledToSave(void) const
{
    return  (!ui->pointNameLineEdit->text().isEmpty() &&
            (!ui->latitudeLineEdit->text().isEmpty() && ui->latitudeLineEdit->text().compare(".") &&
            ui->latitudeLineEdit->text().compare("-") && ui->latitudeLineEdit->text().compare("-.")) &&
            (!ui->longitudeLineEdit->text().isEmpty() && ui->longitudeLineEdit->text().compare(".") &&
            ui->longitudeLineEdit->text().compare("-") && ui->longitudeLineEdit->text().compare("-.")));
}

void AddPointDialog::on_fileListWidget_doubleClicked(const QModelIndex& /*index*/)
{
    QListWidgetItem *item = ui->fileListWidget->currentItem();
    if(item && (item->whatsThis() == "FILE"))
    {
        QString file_name = item->data(Qt::UserRole).toString();
        file_name = QDir::cleanPath(file_name);
        if(!QFile::exists(file_name))
        {
            QMessageBox::warning(QApplication::activeWindow(), QApplication::applicationName(),
            "Невозможно открыть файл `" + file_name + "`. Файл не существует!");
            return;
        }
        if(!QDesktopServices::openUrl(QUrl(QUrl::fromLocalFile(file_name))))
        {
            QMessageBox::information(QApplication::activeWindow(), QApplication::applicationName(),
            "Невозможно открыть файл `" + file_name + "`. Не найдена программа для его открытия!");
            return;
        }
    }
}
